package com.cn.demo.springboot.redis.util;

import java.util.Date;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;

import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

/**
 * RedisClientUtil
 * 
 * @author admin
 *
 */
@Component()
public class RedisClientUtil implements IRedisClientUtil{
	
	@Resource()  
	private StringRedisTemplate stringRedisTemplate;

	/**
	 * 向redis中插入一个String 类型的值o
	 * 
	 * @param key
	 * @param value
	 */
	public void setString( String key, String value) {
		stringRedisTemplate.opsForValue().set(key, value);
	}

	/**
	 * 返回stirng 类型的值
	 * 
	 * @param key
	 * @return 有相同类型的值则返回，否则返回null
	 */
	public String getString( String key) {
		if (DataType.STRING == stringRedisTemplate.type(key)) {
			return stringRedisTemplate.opsForValue().get(key);
		} else {
			return null;
		}
	}

	/**
	 * 返回redis 中map类型的值
	 * 
	 * @param key
	 * @return 有相同类型的值则返回，否则返回null
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public Map<String, String> getMap( String key) {
		DataType type = stringRedisTemplate.type(key);
		if (type == DataType.HASH) {
			Map<Object, Object> map = stringRedisTemplate.opsForHash().entries(key);
			@SuppressWarnings("rawtypes")
			Map<String, String> pp = (Map) map;
			return pp;
		} else {
			return null;
		}
	}

	/**
	 * 向redis中插入一个Map 类型的值
	 * 
	 * @param key
	 * @param m
	 * @return
	 */
	public void setMap( String key, Map<String, String> m) {
		stringRedisTemplate.opsForHash().putAll(key, m);
	}

	/**
	 * delete
	 * 
	 * @param key
	 */
	public void del( String key) {
		stringRedisTemplate.delete(key);
	}

	/**
	 * 将给定键的过期设置为日期时间戳
	 * 
	 * @param key
	 */
	public boolean expireAt( String key, Date date) {
		return stringRedisTemplate.expireAt(key, date);
	}

	/**
	 * 设置多少时间过期
	 * 
	 * @param key
	 * @param timeout
	 *            毫秒数
	 * @return
	 */
	public boolean expire( String key, long timeout) {
		return stringRedisTemplate.expire(key, timeout, TimeUnit.MILLISECONDS);
	}

}
